package controllers

import (
	"stacks/config"
	"stacks/services"
	"stacks/utils"

	"github.com/gin-gonic/gin"
)

// AuthController 认证控制器
type AuthController struct {
	authService *services.AuthService
}

// NewAuthController 创建认证控制器实例
func NewAuthController(cfg *config.Config) *AuthController {
	return &AuthController{
		authService: services.NewAuthService(cfg),
	}
}

// LoginRequest 登录请求
type LoginRequest struct {
	Account  string `json:"account" binding:"required"`
	Password string `json:"password" binding:"required"`
}

// Login 用户登录
// @Summary 用户登录
// @Description 用户登录接口，返回JWT token
// @Tags 认证
// @Accept json
// @Produce json
// @Param loginRequest body LoginRequest true "登录请求参数"
// @Success 0   {object} map[string]interface{} "登录成功"
// @Failure 400 {object} map[string]interface{} "请求参数错误"
// @Failure 401 {object} map[string]interface{} "用户名或密码错误"
// @Router /auth/login [post]
func (c *AuthController) Login(ctx *gin.Context) {
	parser := utils.NewParamParser(ctx)
	var req LoginRequest
	parser.Bind(&req)

	token, err := c.authService.Login(req.Account, req.Password, 1) // 默认使用租户ID 1
	if err != nil {
		utils.Unauthorized(ctx, err.Error())
		return
	}

	utils.Success(ctx, gin.H{
		"token": token,
	})
}

// RegisterRequest 注册请求
type RegisterRequest struct {
	Username string `json:"username" binding:"required"`
	Password string `json:"password" binding:"required"`
	Email    string `json:"email"`
	TenantID uint   `json:"tenantId" binding:"required"`
}

// Register 用户注册
// @Summary 用户注册
// @Description 用户注册接口
// @Tags 认证
// @Accept json
// @Produce json
// @Param registerRequest body RegisterRequest true "注册请求参数"
// @Success 0   {object} map[string]interface{} "注册成功"
// @Failure 400 {object} map[string]interface{} "请求参数错误或用户名已存在"
// @Router /auth/register [post]
func (c *AuthController) Register(ctx *gin.Context) {
	var req RegisterRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		utils.BadRequest(ctx, "请求参数错误")
		return
	}

	err := c.authService.Register(req.Username, req.Password, req.Email, req.TenantID)
	if err != nil {
		utils.BadRequest(ctx, err.Error())
		return
	}

	utils.Success(ctx, "注册成功")
}
